#include "scrollbar.h"
#include "gui_basic.h"   //这里面有与绘图相关的一些函数
#include "text.h"
#include "bsp_lcd.h"
#include "picture.h"
#include <string.h>

/**
 * 画图这玩意儿,我是试出来的？？？？？
 */

/**
 * @brief  设置滚动条的位置
 * @param  scb :滚动条句柄
 * @retval 无
 */
void GUI_Scrollbar_SetPos(Scrollbar_Typedef *scb)
{
    uint16_t scbpos;    //滚动条偏移
    uint16_t scblen;    //滚动条可以滚动的长度
    uint16_t x,y,xlen,ylen;
    //scb->x   scb->y  是指滚动边框(包括上下的按钮)
    scblen=scb->height-2*SCROLL_BTN_HEIGHT-scb->ScrollBarLen;  //得到滚动条滚动空间的长度
    x=scb->x+1;    //滚动条的起始坐标x  跳过了边框
    y=scb->y+SCROLL_BTN_HEIGHT;  //滚动条起始坐标y
    xlen=scb->width-2;   //滚动框宽度-2  //滚动条的宽度
    ylen=scb->ScrollBarLen+scblen;  //滚动框高度-2

    //清楚滚动条
    LCD_SetTextColor(BLACK);
    LCD_DrawRectangle(x,y,xlen,ylen,1);  //局部清屏
    if(scb->TotalItems<=scb->ItemsPerPage)
    {   //总条目不够一页显示的(总条目少了)
        scbpos=0;  //滚动条不偏移
    }
    else
    {   //总条目一页显示不下(滚动条就要上场了)    //减一就是除掉自己
        scbpos=(scb->TopItem*scblen)/(scb->TotalItems-1); //计算当前滚动条偏移的位置  根据比例来算的
        ///mb这是啥意思???
    }
    //画出滚动条
    LCD_SetTextColor(BLUE0);
    LCD_DrawRectangle(x,y+scbpos,xlen,scb->ScrollBarLen,1);  //局部清屏
}

/**
 * @brief  创建一个滚动条
 * @param  scb :滚动条句柄
 * @retval 无
 */
void GUI_ScrollbarDraw(Scrollbar_Typedef *scb)
{
    uint32_t ScbActLen=0;  //滚动条可以滚动的空闲长度

    if(scb==NULL)
    {
        return;
    }
    if(scb->width<=SCROLL_BTN_WIDTH)
    {
        return;   //不能太窄
    }
    if(scb->height<=(2*SCROLL_BTN_HEIGHT))
    {
        return;   //不能太矮
    }

    LCD_SetTextColor(BLACK);
    //画外边框
    LCD_DrawRectangle(scb->x,scb->y,scb->width,scb->height,1);  //局部清屏
    LCD_SetColors(BLUE0,BLACK); //设置多个颜色
    //画外边框
    LCD_DrawRectangle(scb->x,scb->y,scb->width,scb->height,0);  //局部清屏
    //画上下两个按钮
    //这玩意儿我得自己实现
    ShowScrollBtn(scb->x+1,scb->y+1,SCROLL_UP_BTN);
    ShowScrollBtn(scb->x+1,(scb->y+scb->height-SCROLL_BTN_HEIGHT),SCROLL_DOWN_BTN);  //pay attention
    LCD_SetTextColor(BLUE0);
    //画按钮边框
    LCD_DrawLine(scb->x,scb->y+SCROLL_BTN_HEIGHT-1,scb->x+scb->width-1,scb->y+SCROLL_BTN_HEIGHT-1);
    LCD_DrawLine(scb->x,(scb->y+scb->height-SCROLL_BTN_HEIGHT+1),scb->x+scb->width-1,(scb->y+scb->height-SCROLL_BTN_HEIGHT+1));

    //计算滚动条滚动的空间范围
    ScbActLen=scb->height-2*SCROLL_BTN_HEIGHT;

    //每页滚动条目大于总条目数(一页就够了  不需要滚动条)
    if(scb->ItemsPerPage>=scb->TotalItems)
    {
        scb->ScrollBarLen=ScbActLen;
    }
    else
    {   //每页滚动条目小于总条目数(滚动条要起作用了)
        scb->ScrollBarLen=(ScbActLen*scb->ItemsPerPage)/(scb->TotalItems);  //按比例计算滚动条的长度
    }
    //下面就是设置滚动条的位置
    GUI_Scrollbar_SetPos(scb);
}


/**
 * @brief  删除一个滚动条
 * @param  scb :滚动条句柄
 * @retval 无
 */
void GUI_ScrollbarDelete(Scrollbar_Typedef *scb)
{
    LCD_SetTextColor(BLACK);
    LCD_DrawRectangle(scb->x,scb->y,scb->width,scb->height,1);  //局部清屏
}

// //定义一个滚动条类型
// typedef struct
// {
//     uint32_t x;                 //滚动条的位置,以左上角(1,1)为原点
//     uint32_t y;
//     uint32_t width;             //滚动框的宽度
//     uint32_t height;            //滚动框的高度(整个)

//     uint32_t TotalItems;  	  	//总条目数
//     uint32_t ItemsPerPage;		//每页显示的条目数
//     uint32_t TopItem;			//最顶端的条目
//     uint32_t ScrollBarLen;		//滚条长度(可动部分)
// }Scrollbar_Typedef;

Scrollbar_Typedef Scrollbar=
{
    SCROLL_BAR_X,
    SCROLL_BAR_Y,
    15,
    288,

    9,
    3,
    0,
    0
};

/**
 * @brief  测试滚动条
 * @param  scb :滚动条句柄
 * @retval 无
 */
void Test_Scrollbar(void)
{
    GUI_ScrollbarDraw(&Scrollbar);
    GUI_Scrollbar_SetPos(&Scrollbar);
}
